package com.hand.wfive.util


import com.hand.wfive.App
import com.hand.wfive.R
import com.hand.wfive.entity.SwitchSetData
import com.hand.wfive.entity.SwitchSetModel
import com.hand.wfive.loginAndVip.ApiConfig
import com.hand.wfive.loginAndVip.LoginConfig
import com.hand.wfive.loginAndVip.UserManager
import com.hand.wfive.loginAndVip.model.ApiModel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import rxhttp.wrapper.param.RxHttp

/**
 * 功能开关。
 * vip开关:后台开关（if_need_vip）开启，直接vip阻拦后台开关关闭，免费使用一次功能
 * 其它开关：以后台返参为准
 */
object FuncSwitchUtils {

    const val funcEdit = "Edit"
    const val FuncSign = "FuncSign"//签字库选择签字
    const val FuncSignAdd = "FuncSignAdd"//签字
    const val FuncStamp = "FuncStamp"//签字盖章
    const val FuncAlbum = "FuncAlbum"//签字盖章相册
    const val FuncDate = "FuncDate" //签字日期
    const val FuncSave = "FuncSave"//导出至手机

    // 本地保存数据Name/Key
    private const val spName = "FuncSwitchConfig"
    private const val spUseCount = "FuncUseCount"

    /****开关设置,默认关闭 */
    private var switchSetData: SwitchSetData? = null

    // 免费使用次数
    private const val freeUseCount = 1

    /**
         * 是否能免费查看freeCount条数据，默认免费两条
         */
        @JvmStatic
        fun canUseByPosition(position: Int, freeCount: Int = 2): Boolean {
            /*if (BuildConfig.DEBUG){
                return true
            }*/
            refreshUserStatus()
            if (UserManager.getInstance().isVip) return true
            return position < freeCount
        }

        /**
         * 是否能使用
         * 1、会员用户
         * 2、后台开关关闭且使用次数不超过免费次数
         */
        @JvmStatic
        fun canUse(funName: String): Boolean {
            /*if (BuildConfig.DEBUG){
                return true
            }*/
            refreshUserStatus()
            if (UserManager.getInstance().isVip) return true

            val spUtils = initSpUtils()
            val key = "$spUseCount$funName"
            val useCount = spUtils.getValue(key, 0)
            return !isOpenVipSwitch() && useCount < freeUseCount
        }

        /**
         * 增加使用次数
         * 1、非会员用户
         * 2、后台开关关闭
         */
        @JvmStatic
        fun addUseCount(funName: String) {
            if (UserManager.getInstance().isVip) return

            val spUtils = initSpUtils()
            val switch = isOpenVipSwitch()
            if (!switch) {
                val key = "$spUseCount$funName"
                val useCount = spUtils.getValue(key, 0) + 1
                spUtils.putValue(key, useCount)
            }
        }

        /**
         * 是否开启vip阻拦
         */
        private fun isOpenVipSwitch(): Boolean {
            return switchSetData?.if_need_vip == true
        }

        private fun initSpUtils() = SharedPreferencesUtils(App.getContext(), spName)

        /**
         * 获取后台配置的开关（一般在应用主页页进行调用）
         */
        @JvmStatic
        fun getSwitchValue() {
            //如果只有vip开关可以放开该判断，减少不必要的请求。如果有额外的其它功能开关配置需视情况注释
            /*if(UserManager.getInstance().isVip){
                return
            }*/
            val disposable = RxHttp.postForm(ApiConfig.getSwitchValueByParam)
                .add("appid", LoginConfig.AppId)
                .add("channel", App.getContext().getString(R.string.channel))
                .asClass(SwitchSetModel::class.java)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe {
                    if (it.code == ApiConfig.SUCCESSCODE) {
                        switchSetData = it.data
                    }
                }
        }

        @JvmStatic
        fun refreshUserStatus() {
            val disposable = RxHttp.postForm(ApiConfig.userIsVip)
                .add("appid", LoginConfig.AppId)
                .add("userId", UserManager.getInstance().userId)
                .asClass(ApiModel::class.java)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe {
                    if (it.code == ApiConfig.SUCCESSCODE) {
                        val data = it.obj
                        if ((UserManager.getInstance().isVip && data.isVip == 0)
                            || (!UserManager.getInstance().isVip && data.isVip == 1)
                        ) {
                            UserManager.getInstance().deleteUserVip()
                        }
                    } else if (it.code == ApiConfig.USERCHANGEINFOCODE) {
                        UserManager.getInstance().deleteUserVip()
                    }
                }
        }
}